home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Pascal / Code Resources / Eclectic CDEFs / CDEF Utilities / JumpCDEF Folder / JumpCDEF.p < prev    next >
Text File  |  1997-02-27  |  3KB  |  88 lines

  1. {    JumpCDEF    }
  2. {}
  3. {    Copyright © Sebastiano Pilla 1996    }
  4. {    All rights reserved    }
  5. {}
  6. {    Original C source code Copyright © 1991-1995 by James G. Stout }
  7.  
  8. {    <mailto:case@tvol.it>    }
  9.  
  10. {    1) Build this project as a CDEF with ID = 128 as file JumpCDEF.rsrc    }
  11. {}
  12. {    2) Include the CDEF and a custom resource of type 'CJMP', ID = 128 in    }
  13. {    the resource file of your test project.  The 'CJMP' resouce should be any long    }
  14. {}
  15. {    3) Include your CDEF source code in a test project, but with an entry}
  16. {    point of (say) MyCDEFProc instead of Main  }
  17. {}
  18. {    4) In your test source, where Main is found plug the address of }
  19. {    CDEFmain into the 'CJMP' resource, like:    }
  20. {}
  21. {    jmpHndl := CDEFJumpHandle(GetResource('CJMP', 128));    }
  22. {    ChangedResource(Handle(jmpHndl));    }
  23. {    HNoPurge(Handle(jmpHndl));    }
  24. {    if jmpHndl <> nil then jmpHndl^^.fRealDefUPP := NewControlDefProc(@MyCDEFProc);    }
  25. {}
  26. {    This is done automatically for you in the JumpCDEFIntf unit    }
  27. {}
  28. {    5) Use 128 as the CDEF ID in your resource templates. }
  29. {}
  30. {    If you have done things correctly, when the Control Manager tries to}
  31. {    call CDEF 128, it gets this code instead, which recovers the address}
  32. {    of MyCDEFProc and calls it. Then you can use a source-level debugger to debug    }
  33. {    the CDEF code. When it's working, change the CDEF entry point to build a standalone    }
  34. {    resource    }
  35.  
  36. {    Note: THINK Pascal does not let you to assign IDs greater than 63 to "owned" resources like CDEFs. To    }
  37. {    overcome this limitation, build the CDEF in THINK Pascal with any ID you like, then change the ID of the    }
  38. {    just built CDEF resource in the resource file    }
  39.  
  40. unit JumpCDEF;
  41.  
  42.  
  43. interface
  44.  
  45.  
  46.     function Main (inVarCode: SInt16;
  47.                                     inControlHdl: ControlHandle;
  48.                                     inMessage: ControlDefProcMessage;
  49.                                     inParam: SInt32): SInt32;
  50.  
  51.  
  52. implementation
  53.  
  54.  
  55.     const
  56.         kCDEFJumpResType = 'CJMP';            { resource type of the 'CJMP' resource }
  57.         kCDEFJumpResID = 128;                { resource ID of the 'CJMP' resource }
  58.  
  59.  
  60.     type
  61.         CDEFJumpHandle = ^CDEFJumpPtr;
  62.         CDEFJumpPtr = ^CDEFJumpRec;
  63.         CDEFJumpRec = record
  64.                 fRealDefUPP: ControlDefUPP;
  65.             end;
  66.  
  67.  
  68.     function Main (inVarCode: SInt16;
  69.                                     inControlHdl: ControlHandle;
  70.                                     inMessage: ControlDefProcMessage;
  71.                                     inParam: SInt32): SInt32;
  72.         var
  73.             jmpHdl: CDEFJumpHandle;
  74.             realDefUPP: ControlDefUPP;
  75.             resultCode: SInt32;
  76.     begin
  77.         resultCode := 0;
  78.         jmpHdl := CDEFJumpHandle(GetResource(kCDEFJumpResType, kCDEFJumpResID));
  79.         if jmpHdl <> nil then
  80.             begin
  81.                 realDefUPP := jmpHdl^^.fRealDefUPP;
  82.                 resultCode := CallControlDefProc(inVarCode, inControlHdl, inMessage, inParam, realDefUPP);
  83.             end;
  84.         Main := resultCode;
  85.     end;
  86.  
  87.  
  88. end.